package com.jucat.tools;

import cn.hutool.core.date.LocalDateTimeUtil;

import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * 时间相关的工具类
 * @author manem
 */
public class TimeTool {
    /**
     * 时间戳转日期，使用默认的格式 yyyy-MM-dd HH:mm:ss
     * @param timestamp 时间戳
     * @return 日期字符串
     */
    public static String formatTimestamp(long timestamp) {
        return formatTimestamp(timestamp, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 时间戳转日期，指定格式
     * @param timestamp 时间戳
     * @param format 日期的格式，如yyyy-MM-dd HH:mm:ss
     * @return 日期字符串
     */
    public static String formatTimestamp(long timestamp, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date date = Date.from(Instant.ofEpochSecond(timestamp));
        return sdf.format(date);
    }

    /**
     * 日期字符串转时间戳
     * @param datetime 日期字符串，限制格式yyyy-MM-dd HH:mm:ss
     * @return 时间戳
     */
    public static long datetimeToTimestamp(String datetime) {
        return datetimeToTimestamp(datetime, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 日期字符串转时间戳，指定日期的格式
     * @param datetime 日期字符串
     * @param format 日期字符串的格式
     * @return 时间戳
     */
    public static long datetimeToTimestamp(String datetime, String format) {
        LocalDateTime localDateTime = LocalDateTime.parse(datetime, DateTimeFormatter.ofPattern(format));
        return localDateTime.toEpochSecond(ZoneOffset.of("+8"));
    }

    /**
     * 获取当前时间戳，单位秒
     * @return 时间戳
     */
    public static long currentTimestamp() {
        return LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
    }

    /**
     * 获取当前时间戳，单位毫秒
     * @return 时间戳
     */
    public static long currentMillSecond() {
        return System.currentTimeMillis();
    }

    /**
     * 获取当前的年月日，格式为20240801
     * @return 年月日信息
     */
    public static String currentYmd() {
        LocalDateTime now = LocalDateTimeUtil.now();
        return DateTimeFormatter.ofPattern("yyyyMMdd").format(now);
    }
}
